#ifndef __SYS_PARAM_H__
#define __SYS_PARAM_H__

#include "n32l40x.h"


// 使用开发板调试
// #define USE_BOARD_DEBUG        1

// 正式版本关闭打印
// #define DEBUG_OPEN_PRINT    (1)

typedef enum{
    HF_OUT_TEST = 0,
    EMS_9KHZ_TEST,
    EMS_12KHZ_TEST,
    EMS_15KHZ_TEST
}TEST_LIST_e;




typedef enum{
    
    FACE_MODE = 1,
    BODY_MODE,
    HAIR_MODE,
    MAX_MODE,

    TEST_ONLY_EMS_MODE, // 测试模式
    TEST_ONLY_RF_MODE,
    UART_TEST_MODE, //串口指令测试指定输出mode
    ALIGN_MODE,
    LIFT_MODE,
    
}WORK_MODE_e;

// JY1 ems体感波形
typedef enum{
    
    TILA_EMS_MODULE = 1,    // EMS提拉
    BEAT_EMS_MODULE,        // EMS敲打
    WHIRLPOOL_EMS_MODULE,   // ems 漩涡
    
}JY1_EMS_MODULE_e;


// jy1模式
typedef enum{
    
    JY1_HF_MODE = 1,    // 高周波模式
    JY1_EMS_MODE,       // ems模式
    JY1_ALIGN_MODE,     // 老化模式
    JY1_LIFT_MODE,
    
}JY1_WORK_MODE_e;


typedef enum{
    OFF_LINE_STA = 0,
    ON_LINE_STA,
    SHORT_CIRCLE_STA,
}LOAD_STATE_e;



/*********************
 *  1.告警电压阈值为3.65V，在开机状态下电池电压低于3.65开始进行低电提醒，不关机；工作状态即带载情况下，减去对应的压降，比如在所在工作模式下电池电压低于3.65-V0；V0为各个档位带载的均值，进行低电告警；
 * 2.当开机电压低于3.4V或者在工作模式下低于3.3V，停止输出后告警关机；
 * 3.再次开机如上述1和2，放电电池电量只降不升
 */
typedef enum{
    BAT_LOW = 0x01,         // 低于3.6v，进行提示低电
    BAT_LOWEST = 0x02,       // 电池电压 低于3.3v停止输出 
    BAT_TEMP_ERR = 0x04,    // 电池NTC     
    OUTPUT_NTC1_ERR = 0x08, // 输出NTC1 
    OUTPUT_NTC2_ERR = 0x10, // 输出NTC2  
    OUTPUT_NTC3_ERR = 0x20, // 输出NTC3  
    OUTPUT_NTC4_ERR = 0x40, // 输出NTC4     
    SHORT_CIRCLE_ERR = 0x80, // 输出短路
}ERR_MODE_e;


typedef enum{
    SLEEP_STA = 1,
    SYS_IDLE_STA,         // 待机状态 [待机：无任何操作超过180秒，自动关闭仪器]
    NORMAL_WORK_STA,
    ALIGN_STA,      // 老化测试状态
    CHARGE_STA,
    CHARGE_FINISH_STA,  // 充电完成状态，此时系统由5v供电， 电池不供电[所以电池电压检测为0] + 充电状态为充满状态（状态脚：充满时 == 未充电时）
    ERR_STA,
}DEVICE_STA_e;

typedef enum{
    LEVEL_0,
    LEVEL_1 = 1,
    LEVEL_2,
    LEVEL_3,
    HF_MAX_LEVEL = LEVEL_3,
    LEVEL_4,
    LEVEL_5,
    LEVEL_6,
    EMS_MAX_LEVEL = LEVEL_6,
    LEVEL_7,
    LEVEL_8,
    LEVEL_9,
    LEVEL_10,
    LEVEL_MAX = LEVEL_10,
}LEVEL_e;

#define MAX_RUN_TIME    (15*60)

typedef enum{
    BLACK_COLOR = 0,
    WHITE_COLOR,
    RED_COLOR,
    GREEN_COLOR,
    BLUE_COLOR,
    PURPLE_COLOR,
}RGB_COLOR_e;

// 各个模式最大计时时间，超过市场之后，进入idle模式 
#define FACE_MODE_MAX_TIME  (60*5)
#define BODY_MODE_MAX_TIME  (60*5)
#define HAIR_MODE_MAX_TIME  (60*5)
#define MAX_MODE_MAX_TIME   (60*5)

#define ALING_MODE_MAX_OUT_TIME     (1*60)
#define ALING_MODE_MAX_STOP_TIME    (5*60)


typedef struct 
{
    LEVEL_e hf_level; 
    LEVEL_e ems_level;
    char ems_work_flag;
    char load_active_flag;  // 负载在线
    char sys_power_on_flag;
    char sys_power_off_flag;
    char beep_on_flag;
    char motor_on_flag;
    char motor_off_flag;
    char auto_sleep_flag;
    char hf_output_flag;    // 高周波输出标志，判断电池电量时

    char led_refresh_flag;
    int beep_finish_flag;
    int beep_on_cnt;
    int motor_on_cnt;
    char task_1ms_flag;
    char task_1s_flag;
    char cur_mode_active_online_flag;       // 检测到一次负载之后，就被置1
    int run_time;
    int check_load_cnt;     // JE2,切换模式后，前1min进入负载 识别，如果没有负载，则进入idle。如果有负载，则进入预定时长计时
    int cur_mode_run_cnt;
    int idle_sta_cnt;
    int err_cnt;
    int bat_val;
    int aling_run_cnt;      // 老化模式运行市场
    DEVICE_STA_e sta;
    DEVICE_STA_e last_sta;
    JY1_WORK_MODE_e mode;
    // WORK_MODE_e mode;

    LEVEL_e level;
    RGB_COLOR_e rgb_color;
    uint8_t err_mode;   // 肯能有多种异常同时存在

    uint8_t key_long_data;
    uint8_t key_short_data;
    // uint8_t key_long_check_cnt;
    /* data */
}SYS_PARAM_t;

extern SYS_PARAM_t sys_data;




void set_sys_load_state(uint8_t active_flag);
uint8_t get_sys_load_state(void);

int get_sys_battery_voltage(void);
void set_sys_battery_voltage(int bat_val);

RGB_COLOR_e get_sys_rgb_color(void);
void set_sys_rgb_color(RGB_COLOR_e color);

LEVEL_e get_sys_level(void);
void set_sys_level(LEVEL_e level);

LEVEL_e get_sys_ems_level(void);
void set_sys_ems_level(LEVEL_e level);

LEVEL_e get_sys_hf_level(void);
void set_sys_hf_level(LEVEL_e level);


WORK_MODE_e get_sys_mode(void);
void set_sys_mode(WORK_MODE_e mode);

DEVICE_STA_e get_sys_state(void);
void set_sys_state(DEVICE_STA_e mode);

ERR_MODE_e get_sys_err_mode(void);

void clear_sys_err_mode(ERR_MODE_e err_mode);
void set_sys_err_mode(ERR_MODE_e err_mode);

void sys_color_select(void);
void sys_sta_check(void);

void set_sys_hf_flag(uint8_t output_flag);
uint8_t get_sys_hf_flag(void);

void clear_idle_cnt(void);
void clear_cur_mode_run_cnt(void);
int get_cur_mode_run_cnt(void);

void sys_auto_enter_idle_sta_check(void);
void sys_auto_power_off_check(void);

#endif

